CNC 示例 10:编程动态 CNC 路径
见 CNC10_DynamicPath.project
安装目录下的示例工程 CODESYS 在下面 ..\CODESYS SoftMotion\Examples
.
此示例展示了如何在运行时直接在应用程序中创建 CNC 路径,而不是使用来自 CNC 程序对象或文件的 G 代码。这种传统的CNC程序编译时,路径数据存放在一个 SMC_CNC_Data
数据结构类型。然后根据编译模式将此内部数据编译为特定的全局数据结构(SMC_CNC_REF 或者 SMC_OutQueue).
在编译模式下 SMC_CNC_REF,数据存储在一个数组中 SMC_GEOINFO
元素。应用程序代码中的数组通常传递给功能块实例 SMC_NCDecoder
.在运行时,数据在那里被解码并存储在一个全局数据结构中 SMC_OUTQUEUE
.然后可以调用路径预处理功能块。
在编译模式下 SMC_OutQueue, 一个全局数据结构 (SMC_OUTQUEUE
) 生成 直接地.应用程序代码中的这个数据结构被传递给插值器(SMC_Interpolator
FB 实例)。功能块 SMC_NCDecoder
不叫。
在编译模式 文件,数据存储在文件中。数据存储为类型元素的数组 SMC_GEOINFO
并对应编译模式下生成的数据 SMC_CNC_REF.
您可以编写一个应用程序代码来实例化类型为 SMC_OUTQUEUE
在运行时并为其赋值。编写在运行时动态生成的 CNC 路径。您可以将数据结构传递给其他功能块实例(例如传递给路径预处理功能块或功能块 SMC_Interpolator
)。
编程
提示
这 CNCDynamicPath
示例项目位于安装目录 CODESYS.示例项目是从 CNConline
项目。它包括 Path
程序而不是图形编程 Example
小路。类型的数据结构 SMC_OUTQUEUE
是动态生成的。
声明一个类型的数据结构
SMC_OUTQUEUE
.数据结构包含 CNC 路径数据并动态填充。例子:
QUEUE
为具有所需数量的路径分配内存
SMC_GEOINFO
元素。例子:
BUF
声明一个类型的变量
SMC_GEOINFO
与初始步骤。例子:
GEO
数据类型的数组元素
SMC_GEOINFO
对应于 CNC 代码中的路径元素。必须对每个元素执行以下步骤才能将元素添加到SMC_OUTQUEUE
:每个数组元素都有一个起始位置,对应于前一个数组元素的结束位置。
例子:
GEO.piStartPos.dX := 0;
或者GEO.piStartPos := GEO.piDestPos;
确定每个数组元素的移动类型。
例子:
GEO.iMoveType := CCLW;
或者GEO.iMoveType := LIN;
设置运动类型的参数。并非所有运动类型都需要这样做。
示例:对于圆弧(运动类型:CCLW),需要设置以下位置:
geoinfo_A[i].dP1 := 200; geoinfo_A[i].dP2 := 100; geoinfo_A[i].dP3 := 50; geoinfo_A[i].dT1 := 0; geoinfo_A[i].dT2 := 90;
插入结束位置的计算。
SMC_CalcEndPnt(ADR(GEO));
插入对象长度的计算。
SMC_CalcLengthGeo(ADR(GEO));
将对象保存在
QUEUE
:SMC_AppendObj(POQ:=ADR(QUEUE), PGI:=ADR(GEO));
完全创建路径后,必须设置结束标记: QUEUE-bEndOfList = TRUE;
提示
然后,当调用路径预处理功能块时,需要设置起始位或结束位 InternMark
.
带有两个路径元素的 CNC 路径
在这个例子中,数组没有用 X/Y 位置定义。如果这应该是一个具有两个路径元素的示例,那么这些数组每个都必须有两个元素。
例如,从示例项目派生:
xp:ARRAY[1..2] OF REAL:= [100,50]; yp:ARRAY[1..2] OF REAL:= [0,100];
PROGRAM Path VAR iState : INT; QUEUE : SMC_OUTQUEUE; BUF : ARRAY[0..49] OF SMC_GEOINFO; // Memory allocation GEO : SMC_GEOINFO:=(dT1:=0, dT2:=1, dToolRadius:=0, dVel:=100, dVel_End:=100, dAccel:=200, dDecel:=500, iObj_Nr:=0); // Initial path element n : INT := 0; QUEUE.nSize := SIZEOF(BUF); END_VAR CASE iState OF 0: QUEUE.pbyBuffer := ADR(BUF[0]); // Initialize QUEUE SMC_SetQueueCapacity(ADR(QUEUE), SIZEOF(BUF)); iState := iState + 1; 1: // Fill QUEUE WHILE NOT QUEUE.bFull DO // When QUEUE is full, wait until it has been processed by the following FBs n := n + 1; GEO.iSourceLine_No := n; GEO.piStartPos := GEO.piDestPos; // Copying last destination GEO.iMoveType := LIN; // Generating linear movement GEO.iObjNo := GEO.iObjNo + 1; // Calculating number GEO.piDestPos.dX := xp[n]; // Generatint position GEO.piDestPos.dY := yp[n]; SMC_CalcLengthGeo(pg := ADR(GEO)); // Calculating length of object with the help of the standard function SMC_AppendObj(poq:=ADR(QUEUE), pgi:=ADR(GEO)); // Appending object to QUEUE IF n = SIZEOF(xp)/SIZEOF(xp[1]) THEN // All target positions processed QUEUE.bEndOfList := TRUE; n := 0; iState := 2; EXIT; END_IF END_WHILE 2: //Done ; END_CASE CheckVel(bExecute:=TRUE , poqDataIn:=ADR(queue)); // Preprocessing
重要
如果 SMC_OUTQUEUE
数据结构填充有 SMC_GEOINFO
数据和数据结构元素被设置为 bFULL = TRUE
,那么我们不建议进一步分配 SMC_GEOINFO
数据。在这种情况下,路径的创建在运行时被中断,直到路径的第一个元素 SMC_OUTQUEUE
数据结构在插值器中处理。只有这样才能插入另一个元素。
通过分配足够的内存来避免这种中断。见变量 BUF
.
重要
如果数据结构 SMC_OUTQUEUE
在第一次执行后重新填充,然后是插值器和所有预处理功能块(例如: SMC_CheckVelocities
) 必须在上升沿重新启动 Execute
.